package pkg

import (
	"bufio"
	"net"
	"sync"
	"time"
)

type Client struct {
	RemoteAddr   string // 客户端 IP + 端口
	Connection   net.Conn
	Reader       *bufio.Reader
	CreateTime   time.Time // 连接时间
	LastDataTime time.Time // 最近一次接收数据的时间
}

type OnlineMapStu struct {
	M          map[string]*Client
	Register   chan *Client
	Unregister chan *Client
	sync.RWMutex
}

var RandomCode4 = map[string]bool{
	"000": true,
	"001": true,
	"002": true,
	"003": true,
	"004": true,
}

var Code2ToType = map[string]string{
	"00": "AI",
	"01": "AQ",
	"02": "DI",
	"03": "DQ",
	"04": "Other",
	"05": "泵组电磁阀",
	"06": "增压泵电磁阀",
	"07": "电调阀",
	"08": "压力电磁阀",
	"09": "电源控制",
	"10": "电源状态",
	"11": "预留2",
	"12": "预留3",
	"13": "模态采集",
	"14": "故障诊断",
}

type FSEquip struct {
	ID              int     `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	ProjectID       int     `gorm:"column:project_id" json:"project_id"` // 工程ID
	Name            string  `gorm:"column:name" json:"name" binding:"required,max=30"`
	Code1           string  `gorm:"column:code1" json:"code1"`                                             // 自动生成 00-50
	IP              string  `json:"ip" gorm:"column:ip" binding:"required,max=15"`                         // IP地址
	Port            int     `json:"port" gorm:"column:port" binding:"required"`                            // 端口
	RedundantEnable uint8   `json:"redundant_enable" gorm:"column:redundant_enable" binding:"gte=0,lte=1"` // 是否开启冗余模块
	RedundantIP     string  `json:"redundant_ip" gorm:"column:redundant_ip" binding:"max=15"`              // 冗余IP地址
	RedundantPort   int     `json:"redundant_port" gorm:"column:redundant_port"`                           // 冗余端口
	RedundantParam1 float64 `json:"redundant_param1" gorm:"column:redundant_param1"`                       // 冗余参数1
	RedundantParam2 float64 `json:"redundant_param2" gorm:"column:redundant_param2"`                       // 冗余参数2
	RedundantParam3 float64 `json:"redundant_param3" gorm:"column:redundant_param3"`                       // 冗余参数3
	RunningState    uint8   `gorm:"column:running_state" json:"running_state"`                             // // 0.异常 1.正在启动 2.已启动 3.正在停止 4.已停止 5.正在重连 6. 7.

	Detail         string      `gorm:"column:detail" json:"detail"`
	Sort           int         `gorm:"column:sort" json:"sort"`                         // 排序
	CreateTime     *string     `gorm:"column:create_time" json:"create_time"`           // 添加时间
	UpdateTime     *string     `gorm:"column:update_time" json:"update_time"`           // 修改时间
	Del            uint8       `gorm:"column:del" json:"del"`                           // 0. 1.删除
	FSModule       []*FSModule `json:"fs_module"  gorm:"foreignKey:FSID;references:ID"` // foreignKey 外表外键 references 当前表关联键
	ReconnectTimes int         `gorm:"-" json:"reconnect_times"`
	SignalChan     chan int    `gorm:"-" json:"-"`
	DSModuleRead   int64       `gorm:"-" json:"ds_module_read"` // 是否读取过 FS模块规模
	DSModelRead    int64       `gorm:"-" json:"ds_model_read"`  // 是否读取过 FS控制模型规模
	DS             *DataScale  `gorm:"-" json:"ds"`
	DSMatched      uint8       `gorm:"-" json:"ds_matched"`
}

type FSModule struct {
	ID               int               `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	Code1            string            `gorm:"column:code1" json:"code1"` // 00-50
	Code2            string            `gorm:"column:code2" json:"code2"` // 00-14
	Code3            string            `gorm:"column:code3" json:"code3"` // 00-99 模块编号, 模型序号
	FSID             int               `gorm:"column:fs_id" json:"fs_id"`
	ModuleType       string            `gorm:"column:module_type" json:"module_type"` // 模块类型 AI AQ DI DQ Other
	ModuleName       string            `gorm:"column:module_name" json:"module_name"` // AI0 AI1 AI2 ...
	JsonDetail       string            `gorm:"column:json_detail" json:"json_detail"` // 模型详细配置信息JSON格式
	CreateTime       *string           `gorm:"column:create_time" json:"create_time"` // 添加时间
	UpdateTime       *string           `gorm:"column:update_time" json:"update_time"` // 修改时间
	Del              int               `gorm:"column:del" json:"del"`                 // 0.1.删除
	FrameItem        []*FrameItem      `json:"frame_item"  gorm:"foreignKey:ModuleID;references:ID"`
	BengzuModel      *BengzuModel      `gorm:"-"`
	ZengyaModel      *ZengyaModel      `gorm:"-"`
	DiantiaoSVModel  *DiantiaoSVModel  `gorm:"-"`
	PressureSVModel  *PressureSVModel  `gorm:"-"`
	PowerModel       *PowerModel       `gorm:"-"`
	PowerStateModel  *PowerStateModel  `gorm:"-"`
	ModeCollectModel *ModeCollectModel `gorm:"-"`
	DiagModel        *DiagModel        `gorm:"-"`
}

type FrameItem struct {
	ID        int     `json:"id" gorm:"column:id"`
	Code1     string  `json:"code1" gorm:"column:code1"`
	Code2     string  `json:"code2" gorm:"column:code2"`
	Code3     string  `json:"code3" gorm:"column:code3"`
	Code4     string  `json:"code4" gorm:"column:code4"`
	ProjectID int     `gorm:"column:project_id" json:"project_id"` // 工程ID
	PPEID     int     `gorm:"column:ppe_id" json:"ppe_id"`         // 协议ID
	FrameID   int     `gorm:"column:frame_id" json:"frame_id"`     // 帧ID
	FSID      int     `gorm:"column:fs_id" json:"fs_id"`           // 自研设备ID
	ModuleID  int     `gorm:"column:module_id" json:"module_id"`   // 模块ID
	Addr      string  `json:"addr" gorm:"column:addr"`             // 变量地址
	FieldName string  `json:"field_name" gorm:"column:field_name"` // 变量名 (当type是变量时设置)
	DataType  string  `json:"data_type" gorm:"column:data_type"`   // 粗数据类型 (int,float,bool)
	SpecType  string  `json:"spec_type" gorm:"column:spec_type"`   // 具体数据类型 (uint8, uint16, uint32, float32, bool) // 具体类型根据粗类型和起始字节长度计算出
	Value     float64 `json:"value" gorm:"column:value"`           // 解析值
	EV        uint8   `json:"ev" gorm:"column:ev"`                 // 有效值(开关类布尔值专用)
	Endian    string  `json:"endian" gorm:"column:endian"`         // 大小端 [big,little]
	Ratio     float64 `json:"ratio" gorm:"column:ratio"`           // 系数 value除之后的值
	Fe        uint8   `gorm:"column:fe" json:"fe"`                 // 是否科学计数法0.否 1.是
	Precision uint8   `gorm:"column:precision" json:"precision"`   // 小数点保留几位

	UpperLimitVarAddr  string  `gorm:"column:upper_limit_var_addr" json:"upper_limit_var_addr"`   // 上限值-变量地址 (0.未使用变量)
	UpperLimitValue    float64 `gorm:"column:upper_limit_value" json:"upper_limit_value"`         // 上限值-数值
	UpperLimitEnable   uint8   `gorm:"column:upper_limit_enable" json:"upper_limit_enable"`       // 是否启用 0.不启用 1.启用
	Upper2LimitVarAddr string  `gorm:"column:upper2_limit_var_addr" json:"upper2_limit_var_addr"` // 上上限值-变量地址
	Upper2LimitValue   float64 `gorm:"column:upper2_limit_value" json:"upper2_limit_value"`       // 上上限值-数值
	Upper2LimitEnable  uint8   `gorm:"column:upper2_limit_enable" json:"upper2_limit_enable"`     // 是否启用 0.不启用 1.启用
	LowerLimitVarAddr  string  `gorm:"column:lower_limit_var_addr" json:"lower_limit_var_addr"`   // 下限值-变量地址
	LowerLimitValue    float64 `gorm:"column:lower_limit_value" json:"lower_limit_value"`         // 下限值-数值
	LowerLimitEnable   uint8   `gorm:"column:lower_limit_enable" json:"lower_limit_enable"`       // 是否启用 0.不启用 1.启用
	Lower2LimitVarAddr string  `gorm:"column:lower2_limit_var_addr" json:"lower2_limit_var_addr"` // 下下限值-变量地址
	Lower2LimitValue   float64 `gorm:"column:lower2_limit_value" json:"lower2_limit_value"`       // 下下限值-数值
	Lower2LimitEnable  uint8   `gorm:"column:lower2_limit_enable" json:"lower2_limit_enable"`     // 是否启用 0.不启用 1.启用

	ShieldVarID int   `gorm:"column:shield_var_id" json:"shield_var_id"` // 屏蔽-变量地址
	Shield      uint8 `gorm:"column:shield" json:"shield"`               // 屏蔽/滤波/脉冲 0.否 1.是

	ChannelType     string  `gorm:"column:channel_type" json:"channel_type"`           // 通道类型 AI,AQ,DI,DQ
	IsInternal      uint8   `gorm:"column:is_internal" json:"is_internal"`             // 是否内部变量
	RangeUpperLimit float64 `gorm:"column:range_upper_limit" json:"range_upper_limit"` // 量程转换上限
	RangeLowerLimit float64 `gorm:"column:range_lower_limit" json:"range_lower_limit"` // 量程转换下限
	ShieldTime      int     `gorm:"column:shield_time" json:"shield_time"`             // 滤波/脉冲 持续时间(ms)
	Formula         uint8   `gorm:"column:formula" json:"formula"`                     // 计算公式

	AlertVarAddr string `gorm:"column:alert_var_addr" json:"alert_var_addr"` // 报警变量地址
	AlertBit     uint8  `gorm:"column:alert_bit" json:"alert_bit"`           // 报警位-数值
	DiagMode     uint8  `gorm:"column:diag_mode" json:"diag_mode"`           // 诊断模式
	AlertType    uint8  `gorm:"column:alert_type" json:"alert_type"`         // 报警类型
	StoreRate    int    `gorm:"column:store_rate" json:"store_rate"`         // 存储周期(单位: ms)

	//Type        string `gorm:"-" json:"type"`         // 数据块类型 [包头, 帧长, 地址, 功能码, 数据部分, 校验, 帧尾]
	//InputMethod uint8  `gorm:"-" json:"input_method"` // 方式 [ 0.直接输入 1.设置变量 ]
	//Start       int    `gorm:"-" json:"start"`        // 开始字节
	//End         int    `gorm:"-" json:"end"`          // 结束字节
	//RawData     string `gorm:"-" json:"raw_data"`     // 原始十六进制字符串 (type 为非 [var,crc] 时都是直接输入) (type为crc时计算, type为var时按下面规则解析)
	//CheckMethod string `gorm:"-" json:"check_method"` // 方式 [ crc16 ,sum ]
	//CheckStart  int    `gorm:"-" json:"check_start"`  // 校验开始位置 (当type是校验时设置)
	//CheckEnd    int    `gorm:"-" json:"check_end"`    // 校验结束位置 (当type是校验时设置)
	//MultiByte   uint8  `gorm:"-" json:"multi_byte"`   // data_type 为 bool 时 0.单字节 1.多字节
	//BoolBits    uint8  `gorm:"-" json:"bool_bits"`    // 第几位

	CreateTime *string `gorm:"column:create_time" json:"create_time"`
	UpdateTime *string `gorm:"column:update_time" json:"update_time"`
	OPCAddr    string  `gorm:"column:opc_addr" json:"opc_addr"`
}

// BengzuModel 泵组电磁阀模型
type BengzuModel struct {
	QianjibengStartControl string `json:"qianjibeng_start_control"` // 前级泵-启动控制
	QianjibengStopControl  string `json:"qianjibeng_stop_control"`  // 前级泵-停止控制
	QianjibengStartState   string `json:"qianjibeng_start_state"`   // 前级泵-启动状态
	QianjibengStopState    string `json:"qianjibeng_stop_state"`    // 前级泵-停止状态

	LuocibengStartControl string `json:"luocibeng_start_control"` // 罗茨泵-启动控制
	LuocibengStopControl  string `json:"luocibeng_stop_control"`  // 罗茨泵-停止控制
	LuocibengStartState   string `json:"luocibeng_start_state"`   // 罗茨泵-启动状态
	LuocibengStopState    string `json:"luocibeng_stop_state"`    // 罗茨泵-停止状态

	BengqianStartControl string `json:"bengqian_start_control"` // 泵前电磁阀-启动控制
	BengqianStopControl  string `json:"bengqian_stop_control"`  // 泵前电磁阀-停止控制
	BengqianStartState   string `json:"bengqian_start_state"`   // 泵前电磁阀-启动状态
	BengqianStopState    string `json:"bengqian_stop_state"`    // 泵前电磁阀-停止状态

	BengqianPressure string `json:"bengqian_pressure"` // 泵前压力

	/*--- 以上都是选择的 AI~DQ 的通道变量地址 ---*/
	BengzuStartControl      string `json:"bengzu_start_control"` // 泵组控制-启动控制 00
	BengzuStartControlValue uint8  `json:"bengzu_start_control_value"`
	BengzuStopControl       string `json:"bengzu_stop_control"` // 泵组控制-停止控制 01
	BengzuStopControlValue  uint8  `json:"bengzu_stop_control_value"`
	BengzuStartState        string `json:"bengzu_start_state"` // 泵组控制-启动状态 02
	BengzuStartStateValue   uint8  `json:"bengzu_start_state_value"`
	BengzuStopState         string `json:"bengzu_stop_state"` // 泵组控制-停止状态 03
	BengzuStopStateValue    uint8  `json:"bengzu_stop_state_value"`

	BengzuParam1      string  `json:"bengzu_param1"` // 泵组控制-参数1 04
	BengzuParam1Value float64 `json:"bengzu_param1_value"`
	BengzuParam2      string  `json:"bengzu_param2"` // 泵组控制-参数2 05
	BengzuParam2Value float64 `json:"bengzu_param2_value"`
	BengzuParam3      string  `json:"bengzu_param3"` // 泵组控制-参数3 06
	BengzuParam3Value float64 `json:"bengzu_param3_value"`
	BengzuParam4      string  `json:"bengzu_param4"` // 泵组控制-参数4 07
	BengzuParam4Value float64 `json:"bengzu_param4_value"`
	BengzuParam5      string  `json:"bengzu_param5"` // 泵组控制-参数5 08
	BengzuParam5Value float64 `json:"bengzu_param5_value"`
	/*--- 以上都是自动生成的变量地址 ---*/
	Liansuo            string `json:"liansuo"` // 泵组控制-连锁 09
	LiansuoValue       uint8  `json:"liansuo_value"`
	RemoteLocal        string `json:"remote_local"`       // 远程就地 todo 未确认 10
	RemoteLocalValue   uint8  `json:"remote_local_value"` // 远程就地 todo 未确认 10
	ControlMethod      string `json:"control_method"`     // 泵组控制-控制方法 11
	ControlMethodValue uint8  `json:"control_method_value"`
}

// ZengyaModel 增压泵模型
type ZengyaModel struct {
	BengqianPressure     string `json:"bengqian_pressure"`      // 泵前压力
	BengqianStartControl string `json:"bengqian_start_control"` // 泵前电磁阀-启动控制
	BengqianStopControl  string `json:"bengqian_stop_control"`  // 泵前电磁阀-停止控制
	BengqianStartState   string `json:"bengqian_start_state"`   // 泵前电磁阀-启动状态
	BengqianStopState    string `json:"bengqian_stop_state"`    // 泵前电磁阀-停止状态

	ZengyaStartControl string `json:"zengya_start_control"` // 增压泵-启动控制
	ZengyaStopControl  string `json:"zengya_stop_control"`  // 增压泵-停止控制
	ZengyaStartState   string `json:"zengya_start_state"`   // 增压泵-启动状态
	ZengyaStopState    string `json:"zengya_stop_state"`    // 增压泵-停止状态
	/*--- 以上全部都是选择的 AI~DQ ---*/

	Liansuo            string `json:"liansuo"` // 连锁 00
	LiansuoValue       uint8  `json:"liansuo_value"`
	RemoteLocal        string `json:"remote_local"` // 远程/就地 todo 01
	RemoteLocalValue   uint8  `json:"remote_local_value"`
	ControlMethod      string `json:"control_method"` // 控制方法 02
	ControlMethodValue uint8  `json:"control_method_value"`
}

// DiantiaoSVModel 电调阀模型
type DiantiaoSVModel struct {
	CurrentKaidu       string `json:"current_kaidu"`        // 当前开度
	SetKaidu           string `json:"set_kaidu"`            // 设置开度
	Control            string `json:"control"`              // 控制
	SetStep            string `json:"set_step"`             // 设置步长
	SelfInspection     string `json:"self_inspection"`      // 自检控制
	Up                 string `json:"up"`                   // 上调
	Down               string `json:"down"`                 // 下调
	AllOn              string `json:"all_on"`               // 全开
	AllOff             string `json:"all_off"`              // 全关
	AllOnState         string `json:"all_on_state"`         // 全开状态
	AllOffState        string `json:"all_off_state"`        // 全关状态
	QianjiPressure     string `json:"qianji_pressure"`      // 前级压力
	HoujiPressure      string `json:"houji_pressure"`       // 后级压力
	DestPressure       string `json:"dest_pressure"`        // 目标压力
	P                  string `json:"p"`                    // P
	I                  string `json:"i"`                    // I
	D                  string `json:"d"`                    // D
	CustomStartControl string `json:"custom_start_control"` // 自整定-启动控制
	CustomStopControl  string `json:"custom_stop_control"`  // 自整定-停止控制
	CustomStartState   string `json:"custom_start_state"`   // 自整定-启动状态
	CustomStopState    string `json:"custom_stop_state"`    // 自整定-停止状态
	Custom             string `json:"custom"`               // 自整定
	PID                string `json:"pid"`                  // PID
	RemoteLocal        string `json:"remote_local"`         // 远程/就地 todo 待确认 这里的远程就地和其他不一样
	ControlMethod      string `json:"control_method"`       // 控制方法  todo 待确认 这里的远程就地和其他不一样
	/*--- 以上全部都是选择的 AI~DQ ---*/
}

// PressureSVModel 压力电磁阀
type PressureSVModel struct {
	Pressure       string `json:"pressure"`         // 压力测点
	SVStartControl string `json:"sv_start_control"` // 电磁阀-开控制
	SVStopControl  string `json:"sv_stop_control"`  // 电磁阀-关控制
	SVStartState   string `json:"sv_start_state"`   // 电磁阀-开状态
	SVStopState    string `json:"sv_stop_state"`    // 电磁阀-关状态
	/*--- 以上全部都是选择的 AI~DQ ---*/

	Liansuo            string `json:"liansuo"` // 连锁 00
	LiansuoValue       uint8  `json:"liansuo_value"`
	ControlMethod      string `json:"control_method"` // 控制方法 02
	ControlMethodValue uint8  `json:"control_method_value"`
}

// PowerModel 电源模型
type PowerModel struct {
	U1      string  `json:"u1"` // U1 00
	U2      string  `json:"u2"` // U2 01
	U3      string  `json:"u3"` // U3 02
	U1Value float64 `json:"u1_value"`
	U2Value float64 `json:"u2_value"`
	U3Value float64 `json:"u3_value"`

	I1      string  `json:"i1"` // I1 03
	I2      string  `json:"i2"` // I2 04
	I3      string  `json:"i3"` // I3 05
	I1Value float64 `json:"i1_value"`
	I2Value float64 `json:"i2_value"`
	I3Value float64 `json:"i3_value"`

	F      string  `json:"f"` // F 06
	FValue float64 `json:"f_value"`

	ActivePower        string  `json:"active_power"` // 有功功率 07
	ActivePowerValue   float64 `json:"active_power_value"`
	ReactivePower      string  `json:"reactive_power"` // 无功功率 08
	ReactivePowerValue float64 `json:"reactive_power_value"`
	ApparentPower      string  `json:"apparent_power"` // 视在功率 09
	ApparentPowerValue float64 `json:"apparent_power_value"`
	/*--- 以上全部都是自动生成的变量地址 ---*/
}

// PowerStateModel 电源模型
type PowerStateModel struct {
	RunningState      string  `json:"running_state"` // 运行状态 00
	RunningStateValue float64 `json:"running_state_value"`
	ErrorState        string  `json:"error_state"` // 故障状态 01
	ErrorStateValue   float64 `json:"error_state_value"`
	/*--- 以上全部都是自动生成的变量地址 ---*/
}

// ModeCollectModel 模态采集
type ModeCollectModel struct {
	StimulatePoint string `json:"stimulate_point"` // 激励点位
	ResponsePoint  string `json:"response_point"`  // 响应点位
	StartControl   string `json:"start_control"`   // 开控制
	StopControl    string `json:"stop_control"`    // 关控制
	StartState     string `json:"start_state"`     // 开状态
	StopState      string `json:"stop_state"`      // 关状态
	/*--- 以上全部都是选择的 AI~DQ ---*/
}

// DiagModel 故障诊断
type DiagModel struct {
	DiagMode        string  `json:"diag_mode"`   // 诊断模式 00
	DiagParam1      string  `json:"diag_param1"` // 诊断参数1 01
	DiagParam2      string  `json:"diag_param2"` // 诊断参数2 02
	DiagParam3      string  `json:"diag_param3"` // 诊断参数3 03
	DiagParam4      string  `json:"diag_param4"` // 诊断参数4 04
	DiagParam5      string  `json:"diag_param5"` // 诊断参数5 05
	DiagModeValue   float64 `json:"diag_mode_value"`
	DiagParam1Value float64 `json:"diag_param1_value"`
	DiagParam2Value float64 `json:"diag_param2_value"`
	DiagParam3Value float64 `json:"diag_param3_value"`
	DiagParam4Value float64 `json:"diag_param4_value"`
	DiagParam5Value float64 `json:"diag_param5_value"`

	/*--- 以上全部都是自动生成的变量地址 ---*/
}

type DataScale struct {
	AI          uint8
	AQ          uint8
	DI          uint8
	DQ          uint8
	Other       uint8
	EData       uint16
	Bengzu      uint8
	Zengya      uint8
	Diantiao    uint8
	Pressure    uint8
	Power       uint8
	PowerState  uint8
	ModeCollect uint8
	Diag        uint8
}
